package cn.fornever.tools.db.assist.entity;

/**
 * DataBase Meta Data中获取到的外键信息.
 * <p>对应DatabaseMetaData.getExportedKeys()</p>
 *
 * @author ZhangAY
 */
public class ForeignKeyInfo {
    /**
     * 1:主键表的类别(可能为 {@code null})
     */
    String pktableCat;

    /**
     * 2:主键表的模式(可能为 {@code null})
     */
    String pktableSchem;

    /**
     * 3:主键表的表名
     */
    String pktableName;

    /**
     * 4:主键列的列名
     */
    String pkcolumnName;

    /**
     * 5:被导入的外键表类别(可能为 {@code null}),该字符串可能为 {@code null}
     */
    String fktableCat;

    /**
     * 6:被导入的外键表模式(可能为 {@code null}),该字符串可能为 {@code null}
     */
    String fktableSchem;

    /**
     * 7:被导入的外键表名称
     */
    String fktableName;

    /**
     * 8:被导入的外键列名称
     */
    String fkcolumnName;

    /**
     * 9:外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)
     */
    Short keySeq;

    /**
     * 10:更新主键时外键发生的变化
     */
    Short updaterule;

    /**
     * 11:删除主键时外键发生的变化
     */
    Short deleterule;

    /**
     * 12:外键的名称(可能为 {@code null})
     */
    String fkName;

    /**
     * 13:主键的名称(可能为 {@code null})
     */
    String pkName ;

    /**
     * 14:删除主键时外键发生的变化
     */
    Short deferrability ;

    /**
     * 1:主键表的类别(可能为 {@code null})
     * @return 主键表的类别
     */
    public String getPktableCat() {
        return pktableCat;
    }


    /**
     * 1:主键表的类别(可能为 {@code null})
     * @param pktableCat 主键表的类别
     */
    public void setPktableCat(String pktableCat) {
        this.pktableCat = pktableCat;
    }

    /**
     * 2:主键表的模式(可能为 {@code null})
     * @return 主键表的模式
     */
    public String getPktableSchem() {
        return pktableSchem;
    }

    /**
     * 2:主键表的模式(可能为 {@code null})
     * @param pktableSchem 主键表的模式
     */
    public void setPktableSchem(String pktableSchem) {
        this.pktableSchem = pktableSchem;
    }

    /**
     * 3:主键表的表名
     * @return 主键表的表名
     */
    public String getPktableName() {
        return pktableName;
    }

    /**
     * 3:主键表的表名
     * @param pktableName 主键表的表名
     */
    public void setPktableName(String pktableName) {
        this.pktableName = pktableName;
    }

    /**
     * 4:主键列的列名
     * @return 主键列的列名
     */
    public String getPkcolumnName() {
        return pkcolumnName;
    }

    /**
     * 4:主键列的列名
     * @param pkcolumnName 主键列的列名
     */
    public void setPkcolumnName(String pkcolumnName) {
        this.pkcolumnName = pkcolumnName;
    }

    /**
     * 5:被导入的外键表类别(可能为 {@code null}),该字符串可能为 {@code null}
     * @return 被导入的外键表类别(可能为 {@code null}),该字符串可能为 {@code null}
     */
    public String getFktableCat() {
        return fktableCat;
    }

    /**
     * 5:被导入的外键表类别(可能为 {@code null}),该字符串可能为 {@code null}
     * @param fktableCat 被导入的外键表类别(可能为 {@code null}),该字符串可能为 {@code null}
     */
    public void setFktableCat(String fktableCat) {
        this.fktableCat = fktableCat;
    }

    /**
     * 6:被导入的外键表模式(可能为 {@code null}),该字符串可能为 {@code null}
     * @return 被导入的外键表模式(可能为 {@code null}),该字符串可能为 {@code null}
     */
    public String getFktableSchem() {
        return fktableSchem;
    }

    /**
     * 6:被导入的外键表模式(可能为 {@code null}),该字符串可能为 {@code null}
     * @param fktableSchem 被导入的外键表模式(可能为 {@code null}),该字符串可能为 {@code null}
     */
    public void setFktableSchem(String fktableSchem) {
        this.fktableSchem = fktableSchem;
    }

    /**
     * 7:被导入的外键表名称
     * @return 被导入的外键表名称
     */
    public String getFktableName() {
        return fktableName;
    }

    /**
     * 7:被导入的外键表名称
     * @param fktableName 被导入的外键表名称
     */
    public void setFktableName(String fktableName) {
        this.fktableName = fktableName;
    }

    /**
     * 8:被导入的外键列名称
     * @return 被导入的外键列名称
     */
    public String getFkcolumnName() {
        return fkcolumnName;
    }

    /**
     * 8:被导入的外键列名称
     * @param fkcolumnName 被导入的外键列名称
     */
    public void setFkcolumnName(String fkcolumnName) {
        this.fkcolumnName = fkcolumnName;
    }

    /**
     * 9:外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)
     * @return 外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)
     */
    public Short getKeySeq() {
        return keySeq;
    }

    /**
     * 9:外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)
     * @param keySeq 外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)
     */
    public void setKeySeq(Short keySeq) {
        this.keySeq = keySeq;
    }

    /**
     * 10:更新主键时外键发生的变化
     * @return 更新主键时外键发生的变化
     */
    public Short getUpdaterule() {
        return updaterule;
    }

    /**
     * 10:更新主键时外键发生的变化
     * @param updaterule 更新主键时外键发生的变化
     */
    public void setUpdaterule(Short updaterule) {
        this.updaterule = updaterule;
    }

    /**
     * 11:删除主键时外键发生的变化
     * @return 删除主键时外键发生的变化
     */
    public Short getDeleterule() {
        return deleterule;
    }

    /**
     * 11:删除主键时外键发生的变化
     * @param deleterule 删除主键时外键发生的变化
     */
    public void setDeleterule(Short deleterule) {
        this.deleterule = deleterule;
    }

    /**
     * 12:外键的名称(可能为 {@code null})
     * @return 外键的名称(可能为 {@code null})
     */
    public String getFkName() {
        return fkName;
    }

    /**
     * 12:外键的名称(可能为 {@code null})
     * @param fkName 外键的名称(可能为 {@code null})
     */
    public void setFkName(String fkName) {
        this.fkName = fkName;
    }

    /**
     * 13:主键的名称(可能为 {@code null})
     * @return 主键的名称(可能为 {@code null})
     */
    public String getPkName() {
        return pkName;
    }

    /**
     * 13:主键的名称(可能为 {@code null})
     * @param pkName 主键的名称(可能为 {@code null})
     */
    public void setPkName(String pkName) {
        this.pkName = pkName;
    }

    /**
     * 14:删除主键时外键发生的变化
     * @return 删除主键时外键发生的变化
     */
    public Short getDeferrability() {
        return deferrability;
    }

    /**
     * 14:删除主键时外键发生的变化
     * @param deferrability 删除主键时外键发生的变化
     */
    public void setDeferrability(Short deferrability) {
        this.deferrability = deferrability;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ForeignKeyInfo that = (ForeignKeyInfo) o;

        if (pktableCat != null ? !pktableCat.equals(that.pktableCat) : that.pktableCat != null) return false;
        if (pktableSchem != null ? !pktableSchem.equals(that.pktableSchem) : that.pktableSchem != null) return false;
        if (pktableName != null ? !pktableName.equals(that.pktableName) : that.pktableName != null) return false;
        if (pkcolumnName != null ? !pkcolumnName.equals(that.pkcolumnName) : that.pkcolumnName != null) return false;
        if (fktableCat != null ? !fktableCat.equals(that.fktableCat) : that.fktableCat != null) return false;
        if (fktableSchem != null ? !fktableSchem.equals(that.fktableSchem) : that.fktableSchem != null) return false;
        if (fktableName != null ? !fktableName.equals(that.fktableName) : that.fktableName != null) return false;
        if (fkcolumnName != null ? !fkcolumnName.equals(that.fkcolumnName) : that.fkcolumnName != null) return false;
        if (keySeq != null ? !keySeq.equals(that.keySeq) : that.keySeq != null) return false;
        if (updaterule != null ? !updaterule.equals(that.updaterule) : that.updaterule != null) return false;
        if (deleterule != null ? !deleterule.equals(that.deleterule) : that.deleterule != null) return false;
        if (fkName != null ? !fkName.equals(that.fkName) : that.fkName != null) return false;
        if (pkName != null ? !pkName.equals(that.pkName) : that.pkName != null) return false;
        return deferrability != null ? deferrability.equals(that.deferrability) : that.deferrability == null;

    }

    @Override
    public int hashCode() {
        int result = pktableCat != null ? pktableCat.hashCode() : 0;
        result = 31 * result + (pktableSchem != null ? pktableSchem.hashCode() : 0);
        result = 31 * result + (pktableName != null ? pktableName.hashCode() : 0);
        result = 31 * result + (pkcolumnName != null ? pkcolumnName.hashCode() : 0);
        result = 31 * result + (fktableCat != null ? fktableCat.hashCode() : 0);
        result = 31 * result + (fktableSchem != null ? fktableSchem.hashCode() : 0);
        result = 31 * result + (fktableName != null ? fktableName.hashCode() : 0);
        result = 31 * result + (fkcolumnName != null ? fkcolumnName.hashCode() : 0);
        result = 31 * result + (keySeq != null ? keySeq.hashCode() : 0);
        result = 31 * result + (updaterule != null ? updaterule.hashCode() : 0);
        result = 31 * result + (deleterule != null ? deleterule.hashCode() : 0);
        result = 31 * result + (fkName != null ? fkName.hashCode() : 0);
        result = 31 * result + (pkName != null ? pkName.hashCode() : 0);
        result = 31 * result + (deferrability != null ? deferrability.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("ForeignKeyInfo{");
        sb.append("pktableCat='").append(pktableCat).append('\'');
        sb.append(", pktableSchem='").append(pktableSchem).append('\'');
        sb.append(", pktableName='").append(pktableName).append('\'');
        sb.append(", pkcolumnName='").append(pkcolumnName).append('\'');
        sb.append(", fktableCat='").append(fktableCat).append('\'');
        sb.append(", fktableSchem='").append(fktableSchem).append('\'');
        sb.append(", fktableName='").append(fktableName).append('\'');
        sb.append(", fkcolumnName='").append(fkcolumnName).append('\'');
        sb.append(", keySeq=").append(keySeq);
        sb.append(", updaterule=").append(updaterule);
        sb.append(", deleterule=").append(deleterule);
        sb.append(", fkName='").append(fkName).append('\'');
        sb.append(", pkName='").append(pkName).append('\'');
        sb.append(", deferrability=").append(deferrability);
        sb.append('}');
        return sb.toString();
    }
}
